﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ForrajeriaDB; //ESTE USING VA EN TODOS LOS ELEMENTOS DE ESTA CAPA
using System.Data;
using System.Data.SqlClient;

namespace ForrajeriaDAL
{
    public class ProveedorDAL : AccesoDAL, InterfazDAL<ProveedorMO>
    {
        #region VARIABLES PARA STORED QUE MANEJA EL OBJETO DE DAL

        private static string insert = "Proveedor_INSERT";
        private static string delete = "Proveedor_DELETE";
        private static string update = "Proveedor_UPDATE";
        private static string all = "Proveedor_GetALL";
        private static string getXID = "Proveedor_GetByID";
        private static string allRegistrar = "Proveedor_GetALLRegistrar";

        #endregion

        private SqlCommand cmd; //var de comando sql

        #region "Singleton"

        private static ProveedorDAL instance;
        private ProveedorDAL() : base()
        {
        }

        public static ProveedorDAL Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new ProveedorDAL();
                }
                return instance;
            }
        }

        #endregion


        #region Interfaz

        public List<ProveedorMO> GetAll()
        {
            SqlDataReader reader = null;
            List<ProveedorMO> lista = new List<ProveedorMO>();
            try
            {
                cmd = new SqlCommand(all, getConexion());
                cmd.CommandType = CommandType.StoredProcedure;
                opencon();
                reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    ProveedorMO aux = new ProveedorMO();
                    //****************************Formar objeto aux**********************
                    aux.CodigoProveedor = int.Parse(reader["codigoProveedor"].ToString());
                    aux.RazonSocial = reader["razonSocial"].ToString();
                    aux.Telefono = reader["telefono"].ToString();
                    aux.Mail = reader["mail"].ToString();
                    aux.CuitCuil = reader["CuitCuil"].ToString();
                    aux.Calle = reader["calle"].ToString();
                    aux.Piso = reader["piso"].ToString();
                    aux.Dpto = reader["dpto"].ToString();

                    if (reader["nro"].ToString() != "")
                    { aux.Nro = int.Parse(reader["nro"].ToString()); }
                    else { aux.Nro = null; }

                    if (reader["id_localidad"].ToString() != "")
                    { aux.Id_localidad = int.Parse(reader["id_localidad"].ToString()); }
                    else { aux.Id_localidad = null; }

                    //************************Fin Formar objeto aux*********************
                    lista.Add(aux);
                    aux = null;
                }
                return lista;
            }
            catch (Exception ex)
            {
                throw ex; //en caso que no pueda leer desde la base de datos tira el hacia la siguiente capa 
            }
            finally //finalmente cierro el reader que use para traer la consulta esto es importante ya que por alguna razon podria quedar abierto generando una conexion sin uso en la bd que estaria todo el tiempo abierta
            {
                closeReader(reader); //cierro el reader
                closecon();// cierra conexion
            }
        }

        public void Adicionar(ProveedorMO item)
        {
            item.CodigoProveedor = getCodigoInsert("Proveedor", "codigo");
            try
            {
                cmd = new SqlCommand(insert, getConexion());
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add("@codigoProveedor", SqlDbType.Int).Value = item.CodigoProveedor;
                cmd.Parameters.Add("@razonSocial", SqlDbType.VarChar, 50).Value = item.RazonSocial;
                cmd.Parameters.Add("@telefono", SqlDbType.VarChar, 15).Value = item.Telefono;
                cmd.Parameters.Add("@mail", SqlDbType.VarChar, 50).Value = item.Mail;
                cmd.Parameters.Add("@estado", SqlDbType.VarChar, 10).Value = item.Estado;
                cmd.Parameters.Add("@CuitCuil", SqlDbType.VarChar, 50).Value = item.CuitCuil;
                cmd.Parameters.Add("@calle", SqlDbType.VarChar, 50).Value = item.Calle;
                if(item.Nro != null)
                    cmd.Parameters.Add("@nro", SqlDbType.Int).Value = item.Nro;
                cmd.Parameters.Add("@piso", SqlDbType.VarChar, 10).Value = item.Piso;
                cmd.Parameters.Add("@dpto", SqlDbType.VarChar, 10).Value = item.Dpto;
                cmd.Parameters.Add("@id_localidad", SqlDbType.Int).Value = item.Id_localidad;

                opencon();
                cmd.ExecuteNonQuery();
                closecon();

            }
            catch (Exception ex)
            {
                closecon();
                throw ex;
            }
        }

        public void Eliminar(ProveedorMO item)
        {
            try
            {
                cmd = new SqlCommand(delete, getConexion());
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@codigoProveedor", SqlDbType.Int).Value = item.CodigoProveedor;
                opencon();
                cmd.ExecuteNonQuery();
                closecon();
            }
            catch (Exception ex)
            {
                closecon();
                throw ex;
            }
        }

        public void Actualizar(ProveedorMO nuevoItem, ProveedorMO origItem)
        {
            try
            {
                cmd = new SqlCommand(update, getConexion());
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@codigoProveedor", SqlDbType.Int).Value = origItem.CodigoProveedor;
                cmd.Parameters.Add("@razonSocial", SqlDbType.VarChar, 50).Value = nuevoItem.RazonSocial;
                cmd.Parameters.Add("@telefono", SqlDbType.VarChar, 15).Value = nuevoItem.Telefono;
                cmd.Parameters.Add("@mail", SqlDbType.VarChar, 50).Value = nuevoItem.Mail;
                cmd.Parameters.Add("@estado", SqlDbType.VarChar, 10).Value = nuevoItem.Estado;
                cmd.Parameters.Add("@CuitCuil", SqlDbType.VarChar, 50).Value = nuevoItem.CuitCuil;
                cmd.Parameters.Add("@calle", SqlDbType.VarChar, 50).Value = nuevoItem.Calle;
                cmd.Parameters.Add("@nro", SqlDbType.Int).Value = nuevoItem.Nro;
                cmd.Parameters.Add("@piso", SqlDbType.VarChar, 10).Value = nuevoItem.Piso;
                cmd.Parameters.Add("@dpto", SqlDbType.VarChar, 10).Value = nuevoItem.Dpto;
                cmd.Parameters.Add("@id_localidad", SqlDbType.Int).Value = nuevoItem.Id_localidad;
                opencon();
                cmd.ExecuteNonQuery();
                closecon();
            }
            catch (Exception ex)
            {
                closecon();
                throw ex;
            }
        }

        #endregion


        public ProveedorMO getByID(int codigo)
        {
            try
            {
                cmd = new SqlCommand(getXID, getConexion());
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@id", SqlDbType.Int).Value = codigo;
                opencon();
                SqlDataReader reader = cmd.ExecuteReader();
                ProveedorMO aux = new ProveedorMO();
                if (reader.Read())
                {
                    aux.CodigoProveedor = int.Parse(reader["codigoProveedor"].ToString());

                    if (reader["razonSocial"].ToString() != null)
                    { aux.RazonSocial = reader["razonSocial"].ToString(); }
                    else { aux.RazonSocial = ""; }

                    if (reader["telefono"].ToString() != null)
                    { aux.Telefono = reader["telefono"].ToString(); }
                    else { aux.Telefono = ""; }

                    if (reader["mail"].ToString() != null)
                    { aux.Mail = reader["mail"].ToString(); }
                    else { aux.Mail = ""; }

                    if (reader["CuitCuil"].ToString() != null)
                    { aux.CuitCuil = reader["CuitCuil"].ToString(); }
                    else { aux.CuitCuil = ""; }

                    if (reader["calle"].ToString() != null)
                    { aux.Calle = reader["calle"].ToString(); }
                    else { aux.Calle = ""; }

                    aux.Nro = int.Parse(reader["nro"].ToString());

                    if (reader["piso"].ToString() != null)
                    { aux.Piso = reader["piso"].ToString(); }
                    else { aux.Piso = ""; }

                    if (reader["dpto"].ToString() != null)
                    { aux.Dpto = reader["dpto"].ToString(); }
                    else { aux.Dpto = ""; }

                    aux.Id_localidad = int.Parse(reader["id_localidad"].ToString());
                }
                reader.Close();
                closecon();
                return aux;
            }
            catch (SqlException ex)
            {
                closecon();
                throw new Exception("Error de Tipo SQL SERVER: " + ex.Message);
            }
            catch (Exception ex)
            {
                closecon();
                throw new Exception("Error Desconocido: " + ex.Message);
            }
        }


        public List<ProveedorMO> getAllRegistrar()
        {
            SqlDataReader reader = null;
            List<ProveedorMO> lista = new List<ProveedorMO>();
            try
            {
                cmd = new SqlCommand(allRegistrar, getConexion());
                cmd.CommandType = CommandType.StoredProcedure;
                opencon();
                reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    ProveedorMO aux = new ProveedorMO();

                    aux.CodigoProveedor = int.Parse(reader["codigoProveedor"].ToString());

                    if (reader["razonSocial"].ToString() != null)
                    { aux.RazonSocial = reader["razonSocial"].ToString(); }
                    else { aux.RazonSocial = ""; }

                    if (reader["telefono"].ToString() != null)
                    { aux.Telefono = reader["telefono"].ToString(); }
                    else { aux.Telefono = ""; }

                    if (reader["mail"].ToString() != null)
                    { aux.Mail = reader["mail"].ToString(); }
                    else { aux.Mail = ""; }

                    if (reader["CuitCuil"].ToString() != null)
                    { aux.CuitCuil = reader["CuitCuil"].ToString(); }
                    else { aux.CuitCuil = ""; }

                    if (reader["calle"].ToString() != null)
                    { aux.Calle = reader["calle"].ToString(); }
                    else { aux.Calle = ""; }

                    aux.Nro = int.Parse(reader["nro"].ToString());

                    if (reader["piso"].ToString() != null)
                    { aux.Piso = reader["piso"].ToString(); }
                    else { aux.Piso = ""; }

                    if (reader["dpto"].ToString() != null)
                    { aux.Dpto = reader["dpto"].ToString(); }
                    else { aux.Dpto = ""; }

                    aux.Id_localidad = int.Parse(reader["id_localidad"].ToString());

                    lista.Add(aux);
                    aux = null;
                }
                return lista;
            }
            catch (Exception ex)
            {
                throw ex; //en caso que no pueda leer desde la base de datos tira el hacia la siguiente capa 
            }
            finally //finalmente cierro el reader que use para traer la consulta esto es importante ya que por alguna razon podria quedar abierto generando una conexion sin uso en la bd que estaria todo el tiempo abierta
            {
                closeReader(reader); //cierro el reader
                closecon();// cierra conexion
            }
        }

        public DataTable getProveedorReporte(string Forraje="", int proveedor= 0, string ordena = "", string direccion = "")
        {
             DataTable dt = new DataTable();
             string Sql = "SELECT  f.codigoForraje as 'Codigo_Forraje',f.nombreForraje as 'Nombre_Forraje',p.CodigoProveedor as 'Proveedor', p.razonSocial as 'Razon_Social', p.telefono as 'Telefono'" +
                          " , p.mail as 'Email', p.cuitCuil as 'Cuit/Cuil' , ((convert(varchar(50),isnull(p.calle,'-')))+' '+(convert(varchar(50),isnull(p.nro,'-')))+' '+(convert(varchar(50),isnull(p.piso,'')))+' '+(convert(varchar(50),isnull(p.dpto,'')))) as 'Direccion', l.nombre as 'Localidad'"
                          + " from Proveedor p left join Localidad l on p.id_localidad = l.id_localidad "
                          + " left join ProveedorXForraje pf on p.codigoProveedor = pf.codigoProveedor"
                          + " left join Forraje f on pf.codigoForraje = f.codigoForraje"
                          + " WHERE p.Estado = 'A' ";


            try
            {
                SqlCommand cmd = new SqlCommand();
                cmd.CommandType = CommandType.Text;

                if (Forraje != "")
                {
                    
                    Sql += " AND f.nombreForraje like @nombre + '%' ";
                    cmd.Parameters.Add("@nombre", SqlDbType.VarChar).Value = Forraje;
                }
                
                if (proveedor != 0)
                {
                    
                    Sql += " AND p.codigoProveedor = @idprove ";
                    cmd.Parameters.Add(new SqlParameter("@idprove", proveedor));
                }
              
                if (ordena != "")
                {
                    
                    Sql += " order by " + ordena;
                    
                }
                else
                {
                    
                    Sql += " order by f.codigoForraje"  ;
                    

                }

                if (direccion != "")
                {
                    Sql += " " + direccion;
                }

                cmd.Connection = getConexion();
                cmd.CommandText = Sql;
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                opencon();

                da.Fill(dt);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                closecon();
                
            }
            return dt;
        }

        }

    }

